package ext.acae2.dms.web.input;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.log4j.Logger;

import wt.log4j.LogR;
import wt.pom.Transaction;
import wt.util.WTProperties;
import ext.acae2.dms.bean.DocumentBean;
import ext.acae2.dms.bean.EPMDocumentBean;
import ext.acae2.dms.parse.ParseXml;
import ext.acae2.dms.parse.wc9.ParseImportList;
import ext.acae2.util.CmIniFileUtil;
import ext.acae2.util.MappingUtil;
import ext.acae2.util.ParameterUtil;
import ext.acae2.util.StringUtil;

public class CheckProcessor {

	private List<String> returnList = new ArrayList<String>();

	private static final Logger LOGGER = LogR.getLogger(CheckProcessor.class
			.getName());

	@SuppressWarnings("rawtypes")
	public List<String> check(HttpServletRequest request) {
		LOGGER.debug("> Start check");

		Transaction trans = new Transaction();

		try {
			trans.start();
			List<DiskFileItem> parameters = new WebUtil().parseRequest(request);
			LOGGER.debug("parameters: " + parameters.size());

			String supplier = new WebUtil().getSupplierName(parameters);
			LOGGER.debug("supplier: " + supplier);

			// 1. Upload file to server.
			LOGGER.debug("---------- Step 1 start ----------");
			File serverFile = new UploadFileProcessor().upload(parameters);
			LOGGER.debug("---------- Step 1 end ----------");

			// 2. Unzip file or Unrar file.
			LOGGER.debug("---------- Step 2 start ----------");
			String filePath = serverFile.getAbsolutePath();
			String xmlPath = "";
			if (filePath.toUpperCase().endsWith(".ZIP")) {
				xmlPath = new UnzipProcessor().unzip(serverFile);
			} else if (filePath.toUpperCase().endsWith(".RAR")) {
				xmlPath = new UnrarProcessor().unrar(serverFile);
			}
			if (xmlPath.isEmpty()) {
				returnList.add("数据包中无XML文件!!!");
				return returnList;
			}
			LOGGER.debug("xmlPath: " + xmlPath);
			LOGGER.debug("---------- Step 2 end ----------");

			// int j = filePath.lastIndexOf("\\");
			// String supplier = filePath.substring(j + 1, j + 4);
			LOGGER.debug("supplier: " + supplier);

			if (!ParameterUtil.SUPPLIER_TYPE.contains(supplier)) {
				returnList.add("数据包来源有误，请确认来源！");
				return returnList;
			}

			Map<String, List> resultMap = null;
			
			if(supplier.equals("614")){
				resultMap = ParseImportList.readtxt(xmlPath);
			}else{
				LOGGER.debug("---------- Step 2 start ----------");
				// 3. Parse XML.
				resultMap = new ParseXml().execute(xmlPath,
						supplier);
				if(resultMap == null){
					returnList.add("xml无BOM关联关系");
					return returnList;
				}
				LOGGER.debug("---------- Step 2 end ----------");

			}
			
			LOGGER.debug("---------- Step 3 start ----------");
			// 4. check
			
			String wthome = (String) WTProperties.getLocalProperties().get("wt.home");
			String attrPathFolder = wthome + File.separator+"codebase"+File.separator+"ext"+File.separator+"acae2"+File.separator+"dms"+File.separator+"input" +File.separator+supplier+".ini";
			
			CmIniFileUtil ini = new CmIniFileUtil(attrPathFolder);
			String must = ini.getSection("Attr Requird").get("must");
			
			if(!must.isEmpty()){
				
				@SuppressWarnings("unchecked")
				List<EPMDocumentBean> epmList = resultMap
						.get(ParameterUtil.EPMDOCUMENTBEAN);
				for (int i = 0; i < epmList.size(); i++) {
					if(epmList.get(i).getType().equals("UGMASTER")){
						File file = new File(epmList.get(i).getLocationRef());
						if (!file.exists()) {
							returnList.add("数据包中无prt文件 "
									+ epmList.get(i).getLocationRef() + " ，请确认");
						}
						if (must.contains(ini.getSection("Attr Requird").get("drawingNo", ""))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("drawingNo"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 图号 的值不存在，请确认");
							}
						}
						if (StringUtil.isEmpty(epmList.get(i).getVersion())) {
							returnList.add("部件 " + epmList.get(i).getNumber()
									+ " 的 版本 的值不存在，请确认");
						}
						if (StringUtil.isEmpty(epmList.get(i).getName())) {
							returnList.add("部件 " + epmList.get(i).getNumber()
									+ " 的 名称 的值不存在，请确认");
						}
						if (must.contains(MappingUtil.COPYRIGHT)) {
							if (StringUtil.isEmpty(epmList.get(i).getCOPYRIGHT())) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 设计单位 的值不存在，请确认");
							}
						}
						if (must.contains(epmList.get(i).getMap().get("characterType"))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("characterType"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 特性分类 的值不存在，请确认");
							}
						}
						if (must.contains(epmList.get(i).getMap().get("mass"))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("mass"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 质量 的值不存在，请确认");
							}
						}
						if (must.contains(epmList.get(i).getMap().get("unit"))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("unit"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 质量单位 的值不存在，请确认");
							}
						}
						if (must.contains(epmList.get(i).getMap().get("model"))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("model"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 型号 的值不存在，请确认");
							}
						}
						if (must.contains(epmList.get(i).getMap().get("Design"))) {
							if (StringUtil.isEmpty(epmList.get(i).getMap().get("Design"))) {
								returnList.add("部件 " + epmList.get(i).getNumber()
										+ " 的 设计 的值不存在，请确认");
							}
						}
					}
					
				}

				@SuppressWarnings("unchecked")
				List<DocumentBean> docList = resultMap
						.get(ParameterUtil.DOCUMENTBEAN);
				for (int i = 0; i < docList.size(); i++) {
					File file = new File(docList.get(i).getLocationRef());
					if (!file.exists()) {
						returnList.add("数据包中无技术文件 "
								+ docList.get(i).getLocationRef() + " ，请确认");
					}
					if (StringUtil.isEmpty(docList.get(i).getVersion())) {
						returnList.add("文件 " + epmList.get(i).getNumber()
								+ " 的 版本 的值不存在，请确认");
					}
					if (StringUtil.isEmpty(docList.get(i).getName())) {
						returnList.add("文件 " + docList.get(i).getNumber()
								+ " 的 名称 的值不存在，请确认");
					}
					if (must.contains(MappingUtil.TITLE)) {
						if (StringUtil.isEmpty(docList.get(i).getTITLE())) {
							returnList.add("文件 " + docList.get(i).getNumber()
									+ " 的 文件名称 的值不存在，请确认");
						}
					}
					if (must.contains(MappingUtil.DOCUMENTID)) {
						if (StringUtil.isEmpty(docList.get(i).getDOCUMENTID())) {
							returnList.add("文件 " + docList.get(i).getNumber()
									+ " 的 文件号 的值不存在，请确认");
						}
					}
					if (must.contains(MappingUtil.DOCUMENTTYPE)) {
						if (StringUtil.isEmpty(docList.get(i).getDOCUMENTTYPE())) {
							returnList.add("文件 " + docList.get(i).getNumber()
									+ " 的 文件类型 的值不存在，请确认");
						}
					}
					if (must.contains(MappingUtil.MODEL)) {
						if (StringUtil.isEmpty(docList.get(i).getMODEL())) {
							returnList.add("文件 " + docList.get(i).getNumber()
									+ " 的 型号 的值不存在，请确认");
						}
					}
					if (must.contains(MappingUtil.DESIGN)) {
						if (StringUtil.isEmpty(docList.get(i).getDESIGN())) {
							returnList.add("文件 " + docList.get(i).getNumber()
									+ " 的 设计 的值不存在，请确认");
						}
					}
				}
			}
			LOGGER.debug("---------- Step 3 end ----------");
			
		} catch (Exception e) {
			e.printStackTrace();
			returnList.add("数据包内容错误！");
			return returnList;
		}

		LOGGER.debug("> End check");
		return returnList;
	}
}
